MDH 前端周刊第 115 期:TypeScript 5.3、RSC、30 条建议、0.6 + 0.3、CI 时间
题图:jeremythomasphoto @ unsplash。
⚡ Hi,我是云谦,欢迎打开新一期的「MDH:前端周刊」,这是第 0115 期,发表于 2023/11/27,将为您带来最新的资讯和分享。
注意:本文带有大量链接,推荐点击「查看原文」在 MDH 周刊官网上查看。
一周新闻
TypeScript 发布 5.3。 微软发布了 TypeScript 5.3 版本,主要引入了众多新特性,包括导入属性和稳定地支持在所有模块模式中使用 resolution-mode。此外,这个版本提供了针对布尔值的缩窄对比,以及通过 Symbol.hasInstance 进行 instanceof 缩窄。对于 “超级” 的属性访问,TypeScript 5.3 还进行了检查。此外,新版本中的其他改进包括跳过 JSDoc 解析以进行优化,比较非标准化交集以进行优化,以及在 tsserverlibrary.js 和 typescript.js 间进行整合。这个新版本还修复了一些断裂的变化,并进行了正确性改进。
Claude 发布 2.1。 新的人工智能模型 Claude 2.1 已通过 API 在我们的控制台上线,现在承载着我们的 claude.ai 聊天体验。Claude 2.1 在企业关键能力方面取得了进步,包括业界领先的 200K 代币上下文窗口,显著降低模型出现错觉的概率,系统提示和我们新的测试功能:工具使用。同时,我们也在调整价格,以改善各种模型下用户的成本效益。Claude 2.1 在诚实度上取得了显著进步,与我们以前的 Claude 2.0 模型相比,错误陈述的比例下降了 2 倍。此外,我们还推出了一种新的测试功能 —— 工具使用,允许 Claude 与用户现有的流程、产品和 API 进行集成。此外,我们还增加了系统提示,以改进 Claude 的性能。
Hyper 发布 1。 Rust 编程语言的 HTTP 库 hyper 发布了 1.0 版本,它提供了异步 HTTP/1 和 HTTP/2 的服务端和客户端 API,用户可以自主带入 IO 和运行时间。该库已经被 Cloudflare, Discord 等企业在其关键系统中广泛使用,并受到 AWS 和 Embark 等公司的高度评价。hyper 从一个网络开发者的副项目,发展为一个可以支持大规模网络应用的稳定库,对其进行了基本 API 的提供,以确保其安全、快速和灵活性。因此,发布了并承诺在未来三年保持 1.0 版本的稳定。接下来将会更新依赖于 hyper 的一些核心部分,例如 reqwest、Axum、Tonic,并计划将重心转向 HTTP/3。同时,作者表示,非常感谢所有为 hyper 做出贡献的人,以及赞助创建 hyper 的所有公司。
深度好文
《JavaScript 命名约定非常重要》。 本文讨论了在 JavaScript 开发中遵循命名规范的重要性。开发者通过自动化一些常规任务来简化复杂性,转而将注意力集中在更重要的事项上,而命名约定在此过程中发挥着关键作用。正确的命名规则可以提高代码的可读性,并减轻开发者的思考压力。作者细致地讨论了一些通用规则和特殊规则,比如布尔名称应以肯定词前缀开始,函数 / 方法名称应该是一个动词,并且应符合它执行的动作,集合和迭代器的名字应该是复数名词,Class 的名称应该是单数名词等。作者强调,每个项目都应建立自己的命名规约,并坚持使用。尽管遵守命名规约很重要,但每个项目都有其特殊性,关键是要设定并遵守某种规约,保持代码的一致性,提高团队的生产力。
《React Server Components 系列》。 React 服务器组件(React Server Components)已经问世近三年了。但是,似乎很多人并不完全了解它们是如何工作的,也不知道它们能解决什么问题。这是可以理解的--它确实很复杂!不过,我会在本系列文章中为您一一解析。
《告初级开发人员》。 这位有 15 年经验的资深开发者提出的建议包括:不要参加编程训练营,因为这无法在短时间内让你学会编程,更不会让你找到好工作。现在进入市场的门槛比以前更高,因为你需要比 AI 更好,公司更愿意选择效率更高且更便宜的 AI,而不是初级开发者。如果你找到一份编程工作,要学会独立,尽量自己解决问题,而不是繁忙地寻求他人的帮助。编程课程并不能像你想象的那样帮助你,最好的学习方法是做项目,多实践。尝试只专注于一种技术,而不是浅尝辄止。总的来说,你需要专注于快速产出高质量、易维护的代码,保持独立,并通过实践学习。
《Signals vs. Servers》。 在长时间运行的服务器程序中,常需要通过 Unix 信号告知服务器重新加载磁盘中的某些文件(如证书或密钥)。当这些文件发生变动时,服务器需要重新加载这些证书。然而,信号处理方式存在一些问题,例如执行过程中可能出现错误,或执行情况反馈不及时等。一种有效解决方案是创建一个控制服务器。这种方法是在进程中启动一个小型 HTTP 服务器,接收请求和反馈响应。通过这种方式,可以方便地检查重新加载是否成功,提高运维人员的工作效率。但引入 HTTP 或网络可能会使程序变得复杂,取舍在于项目的实际需求和团队人员的技能熟练度。
《React 18 中的并发性》。 React 18 新增的并发功能是一种执行模型,允许程序的不同部分无序执行而不影响最终结果。在浏览器中的 JavaScript 只能访问一个线程,因此采用了一种称为协作多任务处理的并发模型。React 18 分为紧急状态更新和转换状态更新两种更新类型。默认情况下,所有状态更新都是紧急的,不可中断的。如果希望进入并发渲染,需要使用 startTransition 或 useDeferredValue 将更新标记为低优先级。若在渲染低优先级更新时出现高优先级更新,React 会中断当前渲染并转向渲染高优先级更新。另一个重要更新是 Suspense 组件的行为,它在低优先级更新过程中的挂起行为稍有不同。还引入了新的钩子函数 useTransition 和 useDeferredValue,使用这些工具可以处理复杂的状态更新场景。
《如何在 React 中使用 TypeScript》。 本教程详细讲述了如何在 React 中使用 TypeScript。首先我们需要在本地环境中安装 TypeScript,并创建一个使用 TypeScript 的 Vite 项目。然后,向读者解释了 React 和 TypeScript 的基础知识,包括如何定义组件的 prop 类型,如何创建随机用户列表应用,如何在状态中存储用户列表,如何在 UI 上显示用户,如何为类型声明创建单独的文件,如何显示加载指示器,以及如何处理更改事件等。在教程的最后,还详细演示了如何在按钮点击事件中加载用户,以及如何处理输入框的更改事件等。
《Push Ifs Up And Fors Down》。 这篇文章给出了两条与编程有关的经验法则。一是提倡将 if 条件从函数内部移到调用方,这样可以集中控制流,降低 bug 产生的可能性。同时,通过单独的函数进行操作,更容易发现冗余和死条件。另一条是推荐将 for 循环下移,这是源于面向数据的思考方法。批量处理对象比单独处理更高效,可以分摊启动成本,灵活调整处理顺序,甚至无需特定顺序就可以进行向量化 / 数组结构的处理。此外,这两条原则也可以结合使用,即将 if 条件上移,for 循环下移,既可以避免重复评估条件,也能从热循环中去除分支,并可能解锁向量化。
《如何建立信任》。 此篇文章主要讲述了构建员工信任的方法。首先,要做好自己的管理工作,包括遵守基本的职业价值观,如诚实、正直、善良等,并定期进行一对一的反馈、指导以及项目 / 流程管理等。其次,需要在低信任环境下完成基本的工作,如即使在没有赢得团队信任的情况下,也要学会给予良性反馈。此外,作者还建议提供一致性、清晰和透明的沟通,准时完成承诺,设立并尊重工作界限,并用正确的方式使用权力,如适时进行表扬和批评,赋予信任并扮演领导者和导师的角色,尊重保密性等。
《我怎么知道自己做得对不对》。 作者分享了自我学习新技术时的验证假设与自我提升的有效方法。首先,查找可靠的文档和示例,如 MDN 和 web.dev,他们通常能以实际用例解释理论知识;其次,利用编程语言的 linter 插件指导编程,这有助于改进编码习惯;接着,使用诸如 Lighthouse 和 Accessibility Insights 等测量性能的工具以评估是否妥协了性能或可访问性;此外,利用 AI 工具如 Copilot 简化代码。但对于新手来说,要对 AI 生成的指导持怀疑态度;也可以通过向行业内人士询问学习新信息的方式,来学习。最后,查找有关主题的教程以对照使用情况。学到新知识后,应考虑写下来分享,提高自我理解和提高他人。
《30 年的 30 条建议》。 作者在即将迈入 30 岁时,借鉴了凯文・凯利的《68 个不请自来的建议》中的一些想法,总结了自己经年累月的体悟。其中包括:沟通是最重要的技能,要尽力提高;应善待他人,不要让自己的问题成为他人的困扰;多读书;帮助他人成功,长久以后他人也会帮助你;出去旅行的乐趣从出门开始直到回到家才结束;人们更关心故事而非事实;把自己看作想要成为的人而非现在的自我;团队建设中最重要的是信任;要选择长期的选择,利用复合效应;通过不断扩大知识、技能和人脉,把握机遇;别怕显得愚蠢,保持好奇心和积极的心态等。
《人工智能将彻底改变你使用电脑的方式》。 微软联合创始人比尔・盖茨预测,未来五年,人们将无需为完成各种任务使用不同的应用程序,他们只需以日常语言告诉设备自己想做什么。基于人们选择共享的信息数量,软件将对用户的生活有丰富的理解,并因此能够进行个性化反馈。盖茨称这种基于用户理解、自然语言反馈并且可以完成多种任务的软件为 “代理”。他预计,代理将带来计算机革命,就如同我们从敲命令过渡到点击图标一样。此外,代理将颠覆软件业,使得软件业出现自打字命令转变为点按图标以来最大的革命。盖茨预测代理将大大影响四个领域:医疗保健、教育、生产力以及娱乐和购物。但这一技术仍面临许多挑战,包括尚未找出代理的数据结构,以及隐私安全等问题。
《成功的生成式人工智能采用者的 7 个习惯》。 这篇文章为软件团队如何在不浪费资源、不积累技术债和不失去客户信任的情况下,快速利用生成式 AI 建立令人信服的功能提供了一些建议。建议包括:有一个明确的解决问题的用例;有一个坚实的数据基础;保持在方法上的灵活性;从设计原则开始;建立清晰的数据隐私和责任指南;有一个框架进行比较;嵌入最佳实践。这些做法不仅能帮助团队快速利用生成式 AI 为客户构建有用的功能,还能降低技术债务的风险、减少时间和资源的浪费,以及保持客户的信任。
《四种优化》。 本文主要讨论了程序优化的四种主要方法:使用更好的算法、使用更好的数据结构、使用更低级别的系统和接受较低精度的解决方案。文章强调了深度理解你的系统以及选择合适的优化策略的重要性。不同的方法有各自的适用情况和优缺点,所以选择哪种方法应基于具体问题并结合程序的实际需求。此外,文章提醒开发人员关注程序的准确性和避免过早优化,同时估计并控制优化所花费的人力时间。建议开发者在进行程序优化时,先从简单的优化手段开始尝试,之后再逐渐尝试较复杂的优化方法。
《像前辈一样编写代码:编写代码的 5 个必知技巧》。 本文推出了五个简单的编程技巧,包括减少嵌套和提前返回、避免使用无用的 if/else 语句、避免硬编码的字符串和数字、减少代码重复以及理顺函数参数。减少嵌套和提前返回能提高代码的可读性和维护性;避免无用的 if/else 语句能简化代码;避免硬编码的字符串和数字能提高代码的灵活性、重用性、可读性以及可调试性;减少代码重复遵循 "不要重复自己" 的原则,降低维护复杂性,提高代码理解度;理顺函数参数可以提高代码阅读和理解的便利性,方便测试并降低与其它代码的耦合度。以上五种技巧可以帮助开发者提高代码质量,提升代码的维护和开发效率。
《一份 macOS / iOS 远程使用 Windows 操作系统的笔记》。 文章主要介绍了如何使用 MacBook 和 iPad 从远程访问和使用 Windows 主机。首先,作者介绍了在局域网内访问远程桌面的步骤,然后说明了如何在外网访问远程桌面,包括获取公网 IP、设置 DDNS 和端口转发等步骤。接下来,描述了如何在外网远程开机,包括设置 WOL(网络唤醒)功能,以及编写 Python 脚本来发送 "WoL" 魔法数据包。最后,针对使用过程中可能遇到的问题进行了相应的优化,并指出了远程访问 Windows 主机的一些缺憾,如性能问题、网络环境影响、主机故障无法远程修复、相比虚拟机和模拟器的不便等。
《CSS Grid 的交互式指南》。 本文主要向读者介绍了 CSS Grid 布局的用法。CSS Grid 是最新的 CSS 布局算法,可以纯 CSS 定义格子结构,创建复杂的流体布局。它专为在各种类型的用户界面排列项目而设计。该指南还详细讨论了隐含网格和显示网格的概念,介绍了如何使用 grid-template-columns 和 grid-template-rows 属性来指定列和行,以及如何使用 repeat 函数和 grid-column 和 grid-row 属性来定位图格子。还提醒读者注意在使用 CSS Grid 布局时关注键盘用户的体验。最后,文章还演示了如何使用两行 CSS 代码实现子项目的水平和垂直居中。
《解码为什么 JS 中的 0.6 + 0.3 = 0.89999999999999 以及如何解决》。 该文章从深入浅出地讲解了 IEEE 754(双精度浮点)格式如何存储小数,从而导致诸如 0.6 + 0.3 = 0.8999999999999999 或 0.1 + 0.2 = 0.30000000000000004 之类的现象。进一步,文章还详细解析了小数到 IEEE 754 格式的转换过程,以及将 IEEE 754 转回为小数的过程。对于这个问题的解决方案,作者建议可以使用内置函数(如 toFixed () 和 toPrecision ()),但这种方法具有一定的局限性;或者可以使用第三方库(如 math.js,decimal.js,big.js) 来获得更精确的结果。不同的解决方案适用于不同应用需求,最后还提供了其他语言的等效包,如 Java 的 BigDecimal 和 Python 的 Decimal。
《你的 CI 花了多少时间》。 这篇文章主要探讨了持续集成(CI)运行时长与代码合并时间的关系。文章结果显示,CI 时间与合并 PR 的时间呈现出明显的相关性,即 CI 运行的时间越长,PR 的平均合并时间也越长,而且这种关系并非一对一,CI 时间增加 5 分钟,平均合并时间可能会增加一个小时。文章还发现,尽管较短的 CI 时间显然会让 PR 更快地合并,但并不表示更多的修改能被合并。相反地,数据显示,CI 时间在 15 至 30 分钟的工程师每周合并的 PR 数最多。最后,作者建议工程师如果不能减少 CI 执行时间,可以考虑堆叠他们的 PR,即将更改分解为可并行运行 CI 的小型 PR 依赖图。
《我如何将 Rust 的编译时间提高 75%》。 这篇博客主要关于如何改善 Rust 编译时间,通过使用不同的优化方法和替代的编译器链接器。作者测试了多种不同的方法,包括使用 Mold 链接器,Cranelift 编码器,和更高的优化等级,他发现使用 Mold 链接器和 Cranelift 代码生成器可以最大程度地提高编译速度,能使编译时间分别减少 75% 和 25%。此外,博主对 Rust 的热重载提出了替代方法,即 cargo-leptos 的 --hot-reload 标志,它可以在更改检测时通过 web socket 连接向浏览器发送 html 和 css 补丁,并在后台编译。
《Rust without crates.io》。 文章提到了程序员对 crated.io 让大家自由上传和下载代码的依赖,并指出了这种行为的潜在风险:包括单点故障、黑客攻击、国家安全等问题。作者认为,我们应该从开发速度的祭坛上退后一步,理想情况下需要有一个独立于作者进行策展的角色来审视依赖。然而在现实中,这种人力评审的路径很难实现。对此,Linux 发行版如 Debian 的解决方案是将大量库的完整 Rust 源码打包进 librust-cratename-dev,虽然没有进行审计,但已经是一个很大的改进。此外,作者也介绍了如何通过几个简单的命令来实现这一过程。这给予作者对 Rust 更大的信心,他原本担心由 crates.io 的自由选择依赖版本的方式,抵制任何旧方法的语言,例如 C++。幸运的是,Debian 证明了他是错误的。
《Building a Web App in Rust》。 这篇文章分享了作者使用 Rust 编程语言构建网络应用程序 JustFax Online 的经验。作者热爱 Rust 的理由包括其低内存使用、出色的安全性、异步开发、真正的类型安全性等优点。然而,作者也谈到了 Rust 的一些困难之处,例如借用检查器的复杂性、对于初学者的启动难度、相对较长的编译时间以及与 NodeJS 或 Python 相比较小的生态系统。尽管如此,作者仍表示非常享受使用 Rust 构建项目,并认为他能有效运行许多项目而无需花费大量资金。
《Why Rust in Production》。 近年来,Rust 的热度已经飙升,微软、谷歌、亚马逊等科技巨头正积极把 Rust 的优势应用于关键系统。然而,关于 Rust 的讨论仍然大多来自那些没有在大规模生产中使用 Rust,或者仅在非关键系统中使用过 Rust 的人。这导致对 Rust 在生产环境中应用的理解存在偏差,尤其对于中小企业来说更是如此。作为 Rust 顾问,从我与众多大小公司接触中发现,公司更看重效率、稳定性和长期可维护性,而不只是性能。然而,Rust 也有其缺点,如尚处在成熟中的生态系统,硬寻找拥有专业 Rust 经验的开发人员,编译时间较长等。尽管如此,这些挑战并不是难以克服的,只是需要对 Rust 承诺,并愿意投资于培训和工具。考虑到 Rust 所能带来的长期成功,专门的指导和支持是至关重要的。
工具资源
Local Send。
Awesome Black Friday Cyber Monday。 关于黑五买点啥。
星球更新
不知不觉我的知识星球已维护近一年,更了 370 多篇文章,包含了我们最新的观点和见解。以下是近两周的星球更新,访问「q.sorrycc.com」了解更多。
377 - 《2023 年最潮的 Demo 编写方式》
376 - 《播客》
375 - 《装了啥 2023.11》
374 - 《Mako 开发日志(7) - NApi》
373 - 《程序员如何用 AI》
372 - 《我的面试套路 2023》
每周烂梗
小结
如果你喜欢 MDH 前端周刊,请转发给你的朋友,告诉他们到这里来订阅,这是对我最大的帮助。下期见! MDH,让开发者有笑容 :)